package utils

import (
	"errors"
	"fmt"
	"github.com/golang-jwt/jwt"
)

type MyCustomClaims struct {
	Id       int    `json:"id"`
	Username string `json:"username"`
	jwt.StandardClaims
}

var SecretKey = []byte("654816f85dfe2115674e7115c7d1ea51")

// CreateToken 生成token
func CreateToken(claims MyCustomClaims) (string, error) {
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	signToken, err := token.SignedString(SecretKey)
	if err != nil {
		return "", err
	}
	return signToken, nil
}

// ParserToken 简单解析token
func ParserToken(signToken string) (*MyCustomClaims, error) {
	var claims MyCustomClaims
	_, err := jwt.ParseWithClaims(signToken, &claims, func(token *jwt.Token) (interface{}, error) {
		return SecretKey, nil
	})
	if err != nil {
		if ve, ok := err.(*jwt.ValidationError); ok {
			if ve.Errors&jwt.ValidationErrorMalformed != 0 {
				return nil, errors.New("token非法")
			} else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
				return nil, errors.New("token过期")
			} else {
				fmt.Println("Couldn't handle this token:", err)
				return nil, errors.New("token校验失败")
			}
		} else {
			return nil, err
		}
	} else {
		return &claims, nil
	}
}
